package com.catmiao.ai.controller;

import com.catmiao.ai.service.McpService;
import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.mcp.client.DefaultMcpClient;
import dev.langchain4j.mcp.client.McpClient;
import dev.langchain4j.mcp.client.transport.McpTransport;
import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.tool.ToolProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.Map;

@RestController
public class McpController {

    @Autowired
    private StreamingChatModel streamingChatModel;


    @GetMapping("/mcp/chat")
    public Flux<String> chat(@RequestParam String question) throws Exception {


//        /**
//         * 1. 启动 windows 命令行解释器
//         * 2. /c：告诉 cmd执行玩后面的命令后关闭自身
//         * 3. npx： node js 执行工具
//         * 4. -y 自动确认
//         * 5. @baidumap/mcp-server-baidu-map： mcp 服务器包名
//         * 6. 百度地图开放 key
//         */
//
//        // 1. 构建 mcp transport协议
//        StdioMcpTransport transport = new StdioMcpTransport.Builder()
//                .command(List.of("cmd", "/c", "npx", "-y", "@baidumap/mcp-server-baidu-map"))
//                .environment(Map.of("BAIDU_MAP_API_KEY", "oaDm6OjeKFmSHWG5yfHaN3bIvKEETNgo"))
//                .build();
//
//        // 2. 构建 mcp Client
//        McpClient mcpClient = new DefaultMcpClient.Builder()
//                .transport(transport)
//                .build();
//
//        // 3. 创建工具集合原生的 functioncalll类似
//        McpToolProvider toolProvider = McpToolProvider.builder()
//                .mcpClients(mcpClient)
//                .build();
//
//        // 4. 通过 AIServices 给我们自定义接口 McpService构建实现类并将工具集合大模型赋值给 AIService
//        McpService mcpService = AiServices.builder(McpService.class)
//                .streamingChatModel(streamingChatModel)
//                .toolProvider(toolProvider)
//                .build();
//
//        // 5. 调用工具
//
//        return  mcpService.chat(question);

        /**1.构建McpTransport协议
         *
         * 1.1 cmd：启动 Windows 命令行解释器。
         * 1.2 /c：告诉 cmd 执行完后面的命令后关闭自身。
         * 1.3 npx：npx = npm execute package，Node.js 的一个工具，用于执行 npm 包中的可执行文件。
         * 1.4 -y 或 --yes：自动确认操作（类似于默认接受所有提示）。
         * 1.5 @baidumap/mcp-server-baidu-map：要通过 npx 执行的 npm 包名
         * 1.6 BAIDU_MAP_API_KEY 是访问百度地图开放平台API的AK
         */
        McpTransport transport = new StdioMcpTransport.Builder()
                .command(List.of("cmd", "/c", "npx", "-y", "@baidumap/mcp-server-baidu-map"))
                .environment(Map.of("BAIDU_MAP_API_KEY", "oaDm6OjeKFmSHWG5yfHaN3bIvKEETNgo"))
                .build();

        // 2.构建McpClient客户端
        McpClient mcpClient = new DefaultMcpClient.Builder()
                .transport(transport)
                .build();

        // 3.创建工具集和原生的FunctionCalling类似
        ToolProvider toolProvider = McpToolProvider.builder()
                .mcpClients(mcpClient)
                .build();

        // 4.通过AiServivces给我们自定义接口McpService构建实现类并将工具集和大模型赋值给AiService
        McpService mcpService = AiServices.builder(McpService.class)
                .streamingChatModel(streamingChatModel)
                .toolProvider(toolProvider)
                .build();


        // 5.调用我们定义的HighApi接口,通过大模型对百度mcpserver调用
        try {
            return mcpService.chat(question);
        } finally {
            mcpClient.close();
        }
    }
}
